Problemas com modelagem álgebrica: três exemplos para semestres iniciais
نویسنده
چکیده
This paper describes three programming problems that are simple enough to be used in the beginning of a CS undergraduate program but also interesting enough to be worth exploring with different approaches. We are able to apply a mixture of programming practices, abstraction and algebraic approaches to the problems, so that these subjects may be presented as complementary and allowing for clear and elegant solutions. Resumo. Este artigo descreve três problemas de programação que são simples o bastante para serem usados no início de um curso de computação e ao mesmo tempo interessantes o bastante para serem explorados de formas diferentes, como técnicas de programação, abstração e modelagem algébrica, de forma que estes assuntos possam ser apresentado como complementares na busca de soluções simples, claras e elegantes. 1. Introdução e motivação Em uma descrição abrangente, a computação busca modelar e propor soluções através do uso de computadores para problemas de outras áreas do conhecimento ou da própria computação e uma das tarefas essenciais de um curso na área de computação é mostrar técnicas que podem ser usadas nesta busca de modelos e soluções. Por outro lado, uma experiência frequente é notar que aspectos complementares desta busca de soluções costumam ser apresentados em disciplinas isoladas, em semestres distantes e que conversam entre si menos do que poderiam conversar. Como consequencia, a vantagem costuma ser da disciplina que ocupar o espaço inicial, geralmente uma disciplina de programação enquanto disciplinas que esperam mais formalismo e maturidade serão apresentadas mais tarde. Isto tem a óbvia desvantagem de isolar os assuntos e, para os métodos que vierem depois, a de serem considerados técnicas secundárias ou menos relevantes por estudantes que já sabem resolver o problema sendo abordado, mesmo que de formas mais trabalhosas. Além disso, a separação de assuntos também estimula o uso de descrições diferentes para os mesmos modelos, o que não facilita a integração. Neste artigo apresentamos três problemas simples o bastante para serem abordados nos semestres iniciais de um curso de computação e que permitem combinar diferentes técnicas de modelagem, fornecendo um bom espaço de atuação a todas e mostrando como elas podem ser usadas em conjunto. Os três problemas são interessantes, nãotriviais (para um estudante de semestres iniciais) e permitem abordagens de modelagem que fornecerão soluções limpas e elegantes. ar X iv :1 70 8. 08 76 1v 1 [ cs .C Y ] 2 4 A ug 2 01 7 2. Primeiro problema O primeiro e mais simples problema é retirado do repositório de problemas de concursos de programação da Universidade de Valladolid [1] e denominado “The Errant Physicist”. Ele conta a história de um cientista que deseja escrever um programa capaz de receber dois polinômios de duas variáveis (sempre x e y) em uma notação pouco legível e efetuar sua multiplicação, apresentando o polinômio resultante de forma mais legível como no exemplo abaixo: Entrada 1: -yx8+9x3-1+y Entrada 2: x5y+1+x3 Saida 13 2 11 8 6 5 2 5 3 3 x y x y + 8x y + 9x + x y x y + x y + 8x + y 1 Este problema foi originalmente proposto para uso em uma maratona de programação juntamente com vários outros problemas, por isso pode-se esperar que uma solução seja proposta sem grande demora, o que costuma se confirmar em sala de aula. Condições adicionais do problema são as seguintes: • Os expoentes são sempre números positivos. • Termos comuns devem ser simplificados. Por exemplo, 40xy − 38xy será reduzido a 2xy. Termos com coeficiente zero são omitidos. • Coeficientes iguais a 1 são omitidos, exceto no caso de uma constante 1 como no exemplo. • Expoentes iguais a 1 são omitidos e potências x e y são omitidas. • Sinais de + e tem sempre um espaço em branco à frente e outro atrás. • A saída é feita em duas linhas, uma para os expoentes e outra para as variáveis e coeficientes. • Os termos devem ser escritos em ordem decrescente dos expoentes de x e, em caso de empate, em ordem decrescente de expoentes de y. O problema pode ser dividido em três etapas: leitura das duas entradas fornecidas, cálculo do polinômio resultante (com simplificação) e em seguida a impressão no formato exigido. Embora a leitura das entradas e a posterior escrita do resultado sejam etapas interessantes, nos concentraremos em calcular o produto pois esta costuma ser considerada pelos estudantes a etapa mais sofisticada da solução e obter uma versão elegante para esta etapa causa impacto bastante positivo. Em busca de uma representação simples, percebe-se que os termos dos polinômios da entrada podem ser representados como triplas informando o coeficiente e os expoentes de x e y como abaixo: −yx8 ≡ −1 ∗ x ∗ y ≡ (−1, 8, 1) e cada polinômio da entrada pode ser representado como uma lista ou conjunto de termos: P1 = {(−1, 8, 1), (9, 3, 0), (−1, 0, 0), (1, 1, 0)} P2 = {(1, 5, 1), (1, 0, 0), (1, 3, 0)} Se até este ponto a representação dos polinômios é bastante simples e intuitiva, uma vez que eles estejam disponívels chega-se à parte mais interessante: o cálculo do resultado, quando os termos de cada polinômio são multiplicados um a um e armazenados: Mult(P1, P2) : Res = {}; para t1 ∈ P1 : para t2 ∈ P2 : Res = Res ∪ {t1 ⊗ t2}; retorna Res; Figura 1. Multiplicação dos polinômios de entrada. Evidentemente, a operação⊗ é a peça essencial para terminar o cálculo e pode ser reduzida a uma operação algébrica sobre as tuplas apresentadas: t1 = (c1, x1, y1) t2 = (c2, x2, y2) t1 ⊗ t2 = (c1 ∗ c2, x1 + x2, y1 + y2) Depois de tirar proveito deste modelo algébrico e obter o polinômio desejado, ainda é necessário voltar à implementação para um processo de limpeza do polinômio obtido, retirando-se termos com coeficiente zero e simplificando termos de mesmos expoentes. Em seguida uma etapa de ordenação pode ser aplicada para impressão do resultado. Mesmo este processo simples pode ser usado para explorar novas possibilidades: • Um processo de limpeza sem ordenar os termos do resultado é simples mas terá desempenho O(n) onde n é o número de termos; • Ordenar os termos de acordo com os expoentes faz com que termos de mesmos expoentes estejam agrupados, o que facilita a simplificação mas exige que dois termos sejam retirados do resultado e um novo com a simplificação seja inserido na posição correta; • Em qualquer caso, o processo de ordenação permite a construção de um operador ≤ sobre as tuplas propostas, explorando mais um aspecto da representação sugerida. Mesmo uma outra abordagem para este problema fará essencialmente as mesmas tarefas descritas acima pois ele não apresenta uma forma mais simples de solução, mas é muito interessante deixar que os estudantes resolvam o problema, fazendo suas descobertas e depois apresentar a solução em forma algébrica acima dando uma nova clareza à solução obtida e apresentando uma forma alternativa de descrição. Além de ser simples, razoavelmente interessante e trazer a motivação de estar resolvendo uma tarefa aparentemente complexa, o problema tem outras duas vantagens: uma delas é a disponibilidade de teste dsa implementações através do site original, pois isto oferece a possibilidade de validação das soluções, bem como acostuma estudantes a exigências de formato de entrada e saída muitas vezes ignoradas em sala de aula ou consideradas pouco importantes. Outro aspecto interessante é a modelagem com técnicas diferentes em momentos diferentes. Listas e tuplas fornecem as estruturas básicas, uma operação algébrica é introduzida para modelar o produto de termos e outras operações entre listas são necessárias novamente para limpeza e impressão, podendo também ser abordadas de maneira mais formal se desejado. Uma possibilidade de exploração deste problema pode ser a inclusão de mais variáveis ou a divisão entre polinômios, por exemplo. 3. Segundo problema O segundo problema tem a virtude de ser aparentemente mais simples e tem pelo menos duas soluções imediatas, uma delas com dois defeitos graves e a outra com (apenas) um defeito grave. A terceira solução, obtida com uma modelagem mais cuidadosa, oferece uma solução muito eficiente. O enunciado é: Seja a função Fn, que serve para produzir strings: Fn = A, n = 0 B, n = 1 Fn−1 ⊕ Fn−2, n ≥ 2, onde o sinal ⊕ representa a concatenação de strings. Por exemplo, F0 = A F1 = B F2 = BA F3 = BAB F4 = BABBA Deve-se determinar quantas vezes uma string S com até 20 caracteres está repetida dentro de uma string Fn, sabendo que n ≤ 50. Por exemplo, quantas vezes a string AB está em F37? 3.1. Primeiras alternativas Para um estudante de semestres iniciais, a primeira solução é inevitavelmente tentadora: construir a string Fn desejada e depois contar as ocorrências de S dentro dela. É sempre uma experiência interessante perceber como a certeza vitoriosa ao obter a resposta para casos simples altera-se ao tentar tratar casos maiores onde ela falha por falta de memória e/ou excessivo tempo de execução. Embora decepcionante, essa primeira experiência traz a lição de que a solução para um problema simples não precisa ser tão simples quanto o problema e que soluções nem sempre são universais. Depois de convencidos da impraticalidade de construir a string, uma segunda solução se propõe: como a string S a ser procurada tem no máximo 20 caracteres é possível programar a função Fn recursivamente e ao chegar a um de seus casos-base (sempre A ou B) concatena-se esta letra a um buffer S ′ que inicia vazio e vai sendo aumentado até ter o mesmo tamanho de S, retirando-se sua primeira letra se preciso. A cada nova letra concatenada, se S ′ = S temos uma nova ocorrência de S dentro de Fn. Esta abordagem é muito interessante, certamente um passo significativo quando considerada como técnica de resolução e embora não sofra mais com falta de memória sofre do mesmo grave problema de desempenho e uma solução efetiva exige uma modelagem mais cuidadosa. 3.2. Outra possibilidade de modelagem Novas possibilidades surgem quando explora-se a construção de uma das strings Fn. Por exemplo, para F32 sabemos que F32 = F31 ⊕ F3
منابع مشابه
Modelagem Informacional de Requisitos
RESUMO. Vários autores têm apontado problemas na modelagem de requisitos com casos de uso, relacionados com o detalhamento excessivo do comportamento, incompatibilidade com o enfoque de orientação a objetos, e o alcance da análise do domínio do problema. Parte desses problemas podem ser solucionados evitando-se excesso no detalhamento do comportamento através de regras mais objetivas capazes de...
متن کاملApoio a Configuração de Processos de Negócio Dinâmicos
Resumo As organizações estão inseridas em ambientes dinâmicos, onde mudanças são constantes graças a fatores geográficos, climáticos, financeiros e outros. Com isso, as empresas precisam manter seus processos atualizados e funcionando adequadamente, sem desprezar os requisitos de qualidade. Baseado neste cenário, foi proposto na literatura uma abordagem de configuração de processos chamada BVCC...
متن کاملClassificação de Prioridade de Tweets utilizando Máquinas de Vetor de Suporte (Tweet Priority Classification Using Support Vector Machines) [in Portuguese]
Resumo. Este artigo provê resultados iniciais sobre a tarefa de classificação automática de prioridade de tweets, como forma de amenizar a sobrecarga de informação sofrida por usuários do Twitter. Para tanto, aplicamos Máquinas de Vetor de Suporte a um extenso conjunto de exemplos contendo tweets manualmente classificados por nove usuários. Mostramos resultados promissores mesmo com a quantidad...
متن کاملExtracção de Relações Semânticas de Textos em Português Explorando a DBpédia e a Wikipédia
A identificação de relações semânticas, expressas entre entidades mencionadas em textos, é um passo importante para a extracção automática de conhecimento a partir de grandes colecções de documentos, tais como a Web. Vários trabalhos anteriores abordaram esta tarefa para o caso da ĺıngua inglesa, usando técnicas de aprendizagem automática supervisionada para classificação de relações, sendo que...
متن کاملAutomatic Modelling of Lumped Parameters Dynamic Systems
This paper describes the framework and the approach that are utilized in the implementation of a software for automated mathematical modelling of dynamic systems. Application examples illustrate the main features and possibilities of this software. The formalism utilizes a system linear graph representation associated to a systematic procedure in order to obtain a state-space model of lumpedpar...
متن کاملذخیره در منابع من
با ذخیره ی این منبع در منابع من، دسترسی به آن را برای استفاده های بعدی آسان تر کنید
عنوان ژورنال:
- CoRR
دوره abs/1708.08761 شماره
صفحات -
تاریخ انتشار 2017